package com.yoghurt.crypto.transactions.client.widget; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONBoolean; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasWidgets; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Widget; import com.yoghurt.crypto.transactions.client.di.BitcoinPlaceRouter; public class BitcoinJSONViewer extends FlowPanel { private static final int MAX_HEADER = 4; private final BitcoinPlaceRouter router; public BitcoinJSONViewer(final BitcoinPlaceRouter router) { this.router = router; } public void setValue(final String json) { final JSONValue tree = JSONParser.parseStrict(json); clear(); display(2, this, tree); } private void display(final int n, final FlowPanel container, final JSONValue tree) { JSONObject jsonObject; JSONString jsonString; JSONNumber jsonNumber; JSONArray jsonArray; final JSONBoolean jsonBoolean; // Just wanna point out the internal workings of JSONValue are weird as fuck if ((jsonObject = tree.isObject()) != null) { drawObject(container, n, jsonObject); } else if ((jsonString = tree.isString()) != null) { drawString(container, jsonString.stringValue()); } else if ((jsonNumber = tree.isNumber()) != null) { drawNumber(container, jsonNumber.doubleValue()); } else if (tree.isNull() != null) { drawNull(container); } else if ((jsonArray = tree.isArray()) != null) { drawArray(n, container, jsonArray); } else if ((jsonBoolean = tree.isBoolean()) != null) { drawBoolean(container, jsonBoolean.booleanValue()); } } private Widget createHeader(final int n, final String key) { return new HeadingWidget(Math.min(MAX_HEADER, n), key); } private void drawObject(final FlowPanel container, final int n, final JSONObject jsonObject) { for (final String key : jsonObject.keySet()) { container.add(createHeader(n, key)); final FlowPanel subPanel = new FlowPanel(); container.add(subPanel); subPanel.getElement().getStyle().setProperty("border", "2px solid gray"); subPanel.getElement().getStyle().setProperty("marginLeft", "4px"); subPanel.getElement().getStyle().setProperty("padding", "12px"); display(n + 1, subPanel, jsonObject.get(key)); } } private void drawArray(final int n, final FlowPanel container, final JSONArray jsonArray) { for (int i = 0; i < jsonArray.size(); i++) { display(n + 1, container, jsonArray.get(i)); } } private void drawNull(final FlowPanel container) { container.add(new Label("Null")); } private void drawBoolean(final FlowPanel container, final boolean bool) { container.add(new Label(String.valueOf(bool))); } private void drawNumber(final FlowPanel container, final double doubleValue) { container.add(new Label(String.valueOf(doubleValue))); } private void drawString(final HasWidgets container, final String stringValue) { container.add(new HTML(nl2br(SafeHtmlUtils.fromString(stringValue)))); } private static String nl2br(final SafeHtml inp) { return inp.asString().replace("\n", "<br />"); } }